#ifndef MY_GETS_AND_MY_PUTS__H
#define MY_GETS_AND_MY_PUTS__H 

#include "md5.h"
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <mysql/mysql.h>

#define  BIG_FILE 1024*1024*100  //100MB
                                 //枚举发送数据的类型
typedef enum {
    COMMAND_LS,//ls命令
    LS_FAILED, //LS命令错误
    COMMAND_PWD,//pwd命令
    PWD_FAILED, //pwd命令错误
    COMMAND_CD,//cd命令
    CD_FAILED, //cd命令错误
    COMMAND_MKDIR,//mkdir命令
    MKDIR_FAILED, //mkdir命令错误
    COMMAND_RMDIR,//rmdir命令
    RMDIR_FAILED, //rmdir命令错误
    COMMAND_REMOVE,//remove命令
    REMOVE_FAILED, //remove命令错误
    CLIENT_COMMAND,//客户端STDIN发出的命令                                                                   
    COMMAND_GETS,//gets命令
    GETS_FAILED, //gets命令错误
    COMMAND_PUTS,//puts命令
    PUTS_FAILED, //puts命令错误
    PUTS_SECOND,//puts秒传
    INVALID_COMMAND, //无效命令            
    SAME_NAME_FILE,  //重名处理
    NOT_SAME_NAME,   //非重名处理
}DataType_t;

//数据发送协议小火车(TLV)
typedef struct Train_s {
    DataType_t data_type; //数据类型
    int data_len;         //data数据长度
    char data[1000];         //数据
}Train_t;

//数据库查询语句，返回查询个数(行数),传入传出参数存储查询的字符串(只查某一行的一个字段)
//参数为mysql连接，查找字段，查找表，查找条件
//select select_fileld from table_name where condition;
int select_field(MYSQL * mysql, char * serch_fileld, const char * table_name, const char * condition);
//数据库添加操作(添加一行)，instert into ,参数为数据库连接，表名，需要添加的行
//返回值0表示插入成功，非0失败
//insert into table_name row;
int insert_into__row(MYSQL * mysql, const char * table_name, char * row);
//数据库字段修改操作，修改某个条件字段的值,update table_name set result  where condition;
//参数为数据库连接，表名，修改的结果，条件
int update_fileld(MYSQL * mysql, const char * table_name,const char * result, const char * condition);
//数据库删除行操作(物理删除，逻辑删除用update_fileld)
//delete from table_name where condition;
//参数为数据库连接，表名，条件
//返回0成功，非0失败
int delete_from_row(MYSQL * mysql, const char * table_name, const char * condition);
//一次性读取len个字符，返回值为len,为-1时代表客户端断开了
int recvn(int netfd,void * buf, int len);
//小火车装车，返回值检错
int padding_train_by_buf(Train_t * train, void * buf, DataType_t type, int len); 
//接收小火车,返回值为-1时代表客户端断开
int recv_train(int fd, Train_t * dest);
//发送小火车,返回值为send的返回值，用于判断客户端是否断开
int send_train(int netfd, Train_t * train);
//大文件发送
int send_big_file(int netfd,int src_fd, off_t len, off_t offset);
//小文件发送
int send_little_file(int netfd,int src_fd, off_t len);
//大文件接收，返回值为-1时代表服务端已经断开
int recv_and_gets_big_file(int dest_fd, int src_fd, off_t len, off_t offset);
//小文件接收，返回值为-1时代表服务端已经断开
int recv_and_gets_little_file(int dest_fd, int src_fd, off_t len);
//my_gets下载服务端
int my_gets(int netfd, MYSQL * mysql, const char * filename,const char * server_path, const char * client_path, const char * user_name, const char * file_table_name);
//my_puts上传服务端
int my_puts(int netfd, MYSQL * mysql, const char * filename,const char * server_path, const char * client_path, const char * user_name, const char * file_table_name);
#endif
